home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / doom / suckmods.zip / SUCKMODS.ZIP / suck05 / src / misc.qc < prev    next >
Text File  |  1997-05-09  |  15KB  |  670 lines

  1. /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
  2. Used as a positional target for spotlights, etc.
  3. */
  4. void() info_null =
  5. {
  6.     remove(self);
  7. };
  8.  
  9. /*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
  10. Used as a positional target for lightning.
  11. */
  12. void() info_notnull =
  13. {
  14. };
  15.  
  16. //============================================================================
  17.  
  18. float START_OFF = 1;
  19.  
  20. void() light_use =
  21. {
  22.     if (self.spawnflags & START_OFF)
  23.     {
  24.         lightstyle(self.style, "m");
  25.         self.spawnflags = self.spawnflags - START_OFF;
  26.     }
  27.     else
  28.     {
  29.         lightstyle(self.style, "a");
  30.         self.spawnflags = self.spawnflags + START_OFF;
  31.     }
  32. };
  33.  
  34. /*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  35. Non-displayed light.
  36. Default light value is 300
  37. Default style is 0
  38. If targeted, it will toggle between on or off.
  39. */
  40. void() light =
  41. {
  42.     if (!self.targetname)
  43.     {    // inert light
  44.         remove(self);
  45.         return;
  46.     }
  47.     
  48.     if (self.style >= 32)
  49.     {
  50.         self.use = light_use;
  51.         if (self.spawnflags & START_OFF)
  52.             lightstyle(self.style, "a");
  53.         else
  54.             lightstyle(self.style, "m");
  55.     }
  56. };
  57.  
  58. /*QUAKED light_fluoro (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  59. Non-displayed light.
  60. Default light value is 300
  61. Default style is 0
  62. If targeted, it will toggle between on or off.
  63. Makes steady fluorescent humming sound
  64. */
  65. void() light_fluoro =
  66. {
  67.     if (self.style >= 32)
  68.     {
  69.         self.use = light_use;
  70.         if (self.spawnflags & START_OFF)
  71.             lightstyle(self.style, "a");
  72.         else
  73.             lightstyle(self.style, "m");
  74.     }
  75.     
  76.     precache_sound ("ambience/fl_hum1.wav");
  77.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  78. };
  79.  
  80. /*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8)
  81. Non-displayed light.
  82. Default light value is 300
  83. Default style is 10
  84. Makes sparking, broken fluorescent sound
  85. */
  86. void() light_fluorospark =
  87. {
  88.     if (!self.style)
  89.         self.style = 10;
  90.  
  91.     precache_sound ("ambience/buzz1.wav");
  92.     ambientsound (self.origin, "ambience/buzz1.wav", 0.5, ATTN_STATIC);
  93. };
  94.  
  95. /*QUAKED light_globe (0 1 0) (-8 -8 -8) (8 8 8)
  96. Sphere globe light.
  97. Default light value is 300
  98. Default style is 0
  99. */
  100. void() light_globe =
  101. {
  102.     precache_model ("progs/s_light.spr");
  103.     setmodel (self, "progs/s_light.spr");
  104.     makestatic (self);
  105. };
  106.  
  107. void() FireAmbient =
  108. {
  109.     precache_sound ("ambience/fire1.wav");
  110. // attenuate fast
  111.     ambientsound (self.origin, "ambience/fire1.wav", 0.5, ATTN_STATIC);
  112. };
  113.  
  114. /*QUAKED light_torch_small_walltorch (0 .5 0) (-10 -10 -20) (10 10 20)
  115. Short wall torch
  116. Default light value is 200
  117. Default style is 0
  118. */
  119. void() light_torch_small_walltorch =
  120. {
  121.     precache_model ("progs/flame.mdl");
  122.     setmodel (self, "progs/flame.mdl");
  123.     FireAmbient ();
  124.     makestatic (self);
  125. };
  126.  
  127. /*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
  128. Large yellow flame ball
  129. */
  130. void() light_flame_large_yellow =
  131. {
  132.     precache_model ("progs/flame2.mdl");
  133.     setmodel (self, "progs/flame2.mdl");
  134.     self.frame = 1;
  135.     FireAmbient ();
  136.     makestatic (self);
  137. };
  138.  
  139. /*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  140. Small yellow flame ball
  141. */
  142. void() light_flame_small_yellow =
  143. {
  144.     precache_model ("progs/flame2.mdl");
  145.     setmodel (self, "progs/flame2.mdl");
  146.     FireAmbient ();
  147.     makestatic (self);
  148. };
  149.  
  150. /*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
  151. Small white flame ball
  152. */
  153. void() light_flame_small_white =
  154. {
  155.     precache_model ("progs/flame2.mdl");
  156.     setmodel (self, "progs/flame2.mdl");
  157.     FireAmbient ();
  158.     makestatic (self);
  159. };
  160.  
  161. //============================================================================
  162.  
  163.  
  164. /*QUAKED misc_fireball (0 .5 .8) (-8 -8 -8) (8 8 8)
  165. Lava Balls
  166. */
  167.  
  168. void() fire_fly;
  169. void() fire_touch;
  170. void() misc_fireball =
  171. {
  172.     
  173.     precache_model ("progs/lavaball.mdl");
  174.     self.classname = "fireball";
  175.     self.nextthink = time + (random() * 5);
  176.     self.think = fire_fly;
  177.     if (!self.speed)
  178.         self.speed == 1000;
  179. };
  180.  
  181. void() fire_fly =
  182. {
  183. local entity    fireball;
  184.  
  185.     fireball = spawn();
  186.     fireball.solid = SOLID_TRIGGER;
  187.     fireball.movetype = MOVETYPE_TOSS;
  188.     fireball.velocity = '0 0 1000';
  189.     fireball.velocity_x = (random() * 100) - 50;
  190.     fireball.velocity_y = (random() * 100) - 50;
  191.     fireball.velocity_z = self.speed + (random() * 200);
  192.     fireball.classname = "fireball";
  193.     setmodel (fireball, "progs/lavaball.mdl");
  194.     setsize (fireball, '0 0 0', '0 0 0');
  195.     setorigin (fireball, self.origin);
  196.     fireball.nextthink = time + 5;
  197.     fireball.think = SUB_Remove;
  198.     fireball.touch = fire_touch;
  199.     
  200.     self.nextthink = time + (random() * 5) + 3;
  201.     self.think = fire_fly;
  202. };
  203.  
  204.  
  205. void() fire_touch =
  206. {
  207.     T_Damage (other, self, self, 20);
  208.     remove(self);
  209. };
  210.  
  211. //============================================================================
  212.  
  213.  
  214. void() barrel_explode =
  215. {
  216.     self.takedamage = DAMAGE_NO;
  217.     self.classname = "explo_box";
  218.     // did say self.owner
  219.     T_RadiusDamage (self, self, 160, world);
  220.     sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
  221.     particle (self.origin, '0 0 0', 75, 255);
  222.  
  223.     self.origin_z = self.origin_z + 32;
  224.     BecomeExplosion ();
  225. };
  226.  
  227.  
  228.  
  229. /*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64)
  230. TESTING THING
  231. */
  232.  
  233. void() misc_explobox =
  234. {
  235.     local float    oldz;
  236.     
  237.     self.solid = SOLID_BBOX;
  238.     self.movetype = MOVETYPE_NONE;
  239.     precache_model ("maps/b_explob.bsp");
  240.     setmodel (self, "maps/b_explob.bsp");
  241.     precache_sound ("weapons/r_exp3.wav");
  242.     self.health = 20;
  243.     self.th_die = barrel_explode;
  244.     self.takedamage = DAMAGE_AIM;
  245.  
  246.     self.origin_z = self.origin_z + 2;
  247.     oldz = self.origin_z;
  248.     droptofloor();
  249.     if (oldz - self.origin_z > 250)
  250.     {
  251.         dprint ("item fell out of level at ");
  252.         dprint (vtos(self.origin));
  253.         dprint ("\n");
  254.         remove(self);
  255.     }
  256. };
  257.  
  258.  
  259.  
  260.  
  261. /*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
  262. Smaller exploding box, REGISTERED ONLY
  263. */
  264.  
  265. void() misc_explobox2 =
  266. {
  267.     local float    oldz;
  268.     
  269.     self.solid = SOLID_BBOX;
  270.     self.movetype = MOVETYPE_NONE;
  271.     precache_model2 ("maps/b_exbox2.bsp");
  272.     setmodel (self, "maps/b_exbox2.bsp");
  273.     precache_sound ("weapons/r_exp3.wav");
  274.     self.health = 20;
  275.     self.th_die = barrel_explode;
  276.     self.takedamage = DAMAGE_AIM;
  277.  
  278.     self.origin_z = self.origin_z + 2;
  279.     oldz = self.origin_z;
  280.     droptofloor();
  281.     if (oldz - self.origin_z > 250)
  282.     {
  283.         dprint ("item fell out of level at ");
  284.         dprint (vtos(self.origin));
  285.         dprint ("\n");
  286.         remove(self);
  287.     }
  288. };
  289.  
  290. //============================================================================
  291.  
  292. float SPAWNFLAG_SUPERSPIKE    = 1;
  293. float SPAWNFLAG_LASER = 2;
  294.  
  295.  
  296. void() spikeshooter_use =
  297. {
  298.     if (self.spawnflags & SPAWNFLAG_LASER)
  299.     {
  300.         sound (self, CHAN_VOICE, "enforcer/enfire.wav", 1, ATTN_NORM);
  301.     }
  302.     else
  303.     {
  304.         sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM);
  305.         launch_spike (self.origin, self.movedir);
  306.         newmis.velocity = self.movedir * 500;
  307.         if (self.spawnflags & SPAWNFLAG_SUPERSPIKE)
  308.             newmis.touch = superspike_touch;
  309.     }
  310. };
  311.  
  312. void() shooter_think =
  313. {
  314.     spikeshooter_use ();
  315.     self.nextthink = time + self.wait;
  316.     newmis.velocity = self.movedir * 500;
  317. };
  318.  
  319.  
  320. /*QUAKED trap_spikeshooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  321. When triggered, fires a spike in the direction set in QuakeEd.
  322. Laser is only for REGISTERED.
  323. */
  324.  
  325. void() trap_spikeshooter =
  326. {
  327.     SetMovedir ();
  328.     self.use = spikeshooter_use;
  329.     if (self.spawnflags & SPAWNFLAG_LASER)
  330.     {
  331.         precache_model2 ("progs/laser.mdl");
  332.         
  333.         precache_sound2 ("enforcer/enfire.wav");
  334.         precache_sound2 ("enforcer/enfstop.wav");
  335.     }
  336.     else
  337.         precache_sound ("weapons/spike2.wav");
  338. };
  339.  
  340.  
  341. /*QUAKED trap_shooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  342. Continuously fires spikes.
  343. "wait" time between spike (1.0 default)
  344. "nextthink" delay before firing first spike, so multiple shooters can be stagered.
  345. */
  346. void() trap_shooter =
  347. {
  348.     trap_spikeshooter ();
  349.     
  350.     if (self.wait == 0)
  351.         self.wait = 1;
  352.     self.nextthink = self.nextthink + self.wait + self.ltime;
  353.     self.think = shooter_think;
  354. };
  355.  
  356.  
  357.  
  358. /*
  359. ===============================================================================
  360.  
  361.  
  362. ===============================================================================
  363. */
  364.  
  365.  
  366. void() make_bubbles;
  367. void() bubble_remove;
  368. void() bubble_bob;
  369.  
  370. /*QUAKED air_bubbles (0 .5 .8) (-8 -8 -8) (8 8 8)
  371.  
  372. testing air bubbles
  373. */
  374.  
  375. void() air_bubbles =
  376.  
  377. {
  378.     if (deathmatch)
  379.     {
  380.         remove (self);
  381.         return;
  382.     }
  383.     precache_model ("progs/s_bubble.spr");
  384.     self.nextthink = time + 1;
  385.     self.think = make_bubbles;
  386. };
  387.  
  388. void() make_bubbles =
  389. {
  390. local entity    bubble;
  391.  
  392.     bubble = spawn();
  393.     setmodel (bubble, "progs/s_bubble.spr");
  394.     setorigin (bubble, self.origin);
  395.     bubble.movetype = MOVETYPE_NOCLIP;
  396.     bubble.solid = SOLID_NOT;
  397.     bubble.velocity = '0 0 15';
  398.     bubble.nextthink = time + 0.5;
  399.     bubble.think = bubble_bob;
  400.     bubble.touch = bubble_remove;
  401.     bubble.classname = "bubble";
  402.     bubble.frame = 0;
  403.     bubble.cnt = 0;
  404.     setsize (bubble, '-8 -8 -8', '8 8 8');
  405.     self.nextthink = time + random() + 0.5;
  406.     self.think = make_bubbles;
  407. };
  408.  
  409. void() bubble_split =
  410. {
  411. local entity    bubble;
  412.     bubble = spawn();
  413.     setmodel (bubble, "progs/s_bubble.spr");
  414.     setorigin (bubble, self.origin);
  415.     bubble.movetype = MOVETYPE_NOCLIP;
  416.     bubble.solid = SOLID_NOT;
  417.     bubble.velocity = self.velocity;
  418.     bubble.nextthink = time + 0.5;
  419.     bubble.think = bubble_bob;
  420.     bubble.touch = bubble_remove;
  421.     bubble.classname = "bubble";
  422.     bubble.frame = 1;
  423.     bubble.cnt = 10;
  424.     setsize (bubble, '-8 -8 -8', '8 8 8');
  425.     self.frame = 1;
  426.     self.cnt = 10;
  427.     if (self.waterlevel != 3)
  428.         remove (self);
  429. };
  430.  
  431. void() bubble_remove =
  432. {
  433.     if (other.classname == self.classname)
  434.     {
  435. //        dprint ("bump");
  436.         return;
  437.     }
  438.     remove(self);
  439. };
  440.  
  441. void() bubble_bob =
  442. {
  443. local float        rnd1, rnd2, rnd3;
  444. local vector    vtmp1, modi;
  445.  
  446.     self.cnt = self.cnt + 1;
  447.     if (self.cnt == 4)
  448.         bubble_split();
  449.     if (self.cnt == 20)
  450.         remove(self);
  451.  
  452.     rnd1 = self.velocity_x + (-10 + (random() * 20));
  453.     rnd2 = self.velocity_y + (-10 + (random() * 20));
  454.     rnd3 = self.velocity_z + 10 + random() * 10;
  455.  
  456.     if (rnd1 > 10)
  457.         rnd1 = 5;
  458.     if (rnd1 < -10)
  459.         rnd1 = -5;
  460.         
  461.     if (rnd2 > 10)
  462.         rnd2 = 5;
  463.     if (rnd2 < -10)
  464.         rnd2 = -5;
  465.         
  466.     if (rnd3 < 10)
  467.         rnd3 = 15;
  468.     if (rnd3 > 30)
  469.         rnd3 = 25;
  470.     
  471.     self.velocity_x = rnd1;
  472.     self.velocity_y = rnd2;
  473.     self.velocity_z = rnd3;
  474.         
  475.     self.nextthink = time + 0.5;
  476.     self.think = bubble_bob;
  477. };
  478.  
  479. /*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
  480. ~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
  481.  
  482. /*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8)
  483.  
  484. Just for the debugging level.  Don't use
  485. */
  486.  
  487. void() viewthing =
  488.  
  489. {
  490.     self.movetype = MOVETYPE_NONE;
  491.     self.solid = SOLID_NOT;
  492.     precache_model ("progs/player.mdl");
  493.     setmodel (self, "progs/player.mdl");
  494. };
  495.  
  496.  
  497. /*
  498. ==============================================================================
  499.  
  500. SIMPLE BMODELS
  501.  
  502. ==============================================================================
  503. */
  504.  
  505. void() func_wall_use =
  506. {    // change to alternate textures
  507.     self.frame = 1 - self.frame;
  508. };
  509.  
  510. /*QUAKED func_wall (0 .5 .8) ?
  511. This is just a solid wall if not inhibitted
  512. */
  513. void() func_wall =
  514. {
  515.     self.angles = '0 0 0';
  516.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  517.     self.solid = SOLID_BSP;
  518.     self.use = func_wall_use;
  519.     setmodel (self, self.model);
  520. };
  521.  
  522.  
  523. /*QUAKED func_illusionary (0 .5 .8) ?
  524. A simple entity that looks solid but lets you walk through it.
  525. */
  526. void() func_illusionary =
  527.  
  528. {
  529.     self.angles = '0 0 0';
  530.     self.movetype = MOVETYPE_NONE;
  531.     self.solid = SOLID_NOT;
  532.     setmodel (self, self.model);
  533.     makestatic ();
  534. };
  535.  
  536. /*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4
  537. This bmodel will appear if the episode has allready been completed, so players can't reenter it.
  538. */
  539. void() func_episodegate =
  540.  
  541. {
  542.     if (!(serverflags & self.spawnflags))
  543.         return;            // can still enter episode
  544.  
  545.     self.angles = '0 0 0';
  546.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  547.     self.solid = SOLID_BSP;
  548.     self.use = func_wall_use;
  549.     setmodel (self, self.model);
  550. };
  551.  
  552. /*QUAKED func_bossgate (0 .5 .8) ?
  553. This bmodel appears unless players have all of the episode sigils.
  554. */
  555. void() func_bossgate =
  556.  
  557. {
  558.     if ( (serverflags & 15) == 15)
  559.         return;        // all episodes completed
  560.     self.angles = '0 0 0';
  561.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  562.     self.solid = SOLID_BSP;
  563.     self.use = func_wall_use;
  564.     setmodel (self, self.model);
  565. };
  566.  
  567. //============================================================================
  568. /*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  569. */
  570. void() ambient_suck_wind =
  571. {
  572.     precache_sound ("ambience/suck1.wav");
  573.     ambientsound (self.origin, "ambience/suck1.wav", 1, ATTN_STATIC);
  574. };
  575.  
  576. /*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  577. */
  578. void() ambient_drone =
  579. {
  580.     precache_sound ("ambience/drone6.wav");
  581.     ambientsound (self.origin, "ambience/drone6.wav", 0.5, ATTN_STATIC);
  582. };
  583.  
  584. /*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  585. */
  586. void() ambient_flouro_buzz =
  587. {
  588.     precache_sound ("ambience/buzz1.wav");
  589.     ambientsound (self.origin, "ambience/buzz1.wav", 1, ATTN_STATIC);
  590. };
  591. /*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  592. */
  593. void() ambient_drip =
  594. {
  595.     precache_sound ("ambience/drip1.wav");
  596.     ambientsound (self.origin, "ambience/drip1.wav", 0.5, ATTN_STATIC);
  597. };
  598. /*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  599. */
  600. void() ambient_comp_hum =
  601. {
  602.     precache_sound ("ambience/comp1.wav");
  603.     ambientsound (self.origin, "ambience/comp1.wav", 1, ATTN_STATIC);
  604. };
  605. /*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  606. */
  607. void() ambient_thunder =
  608. {
  609.     precache_sound ("ambience/thunder1.wav");
  610.     ambientsound (self.origin, "ambience/thunder1.wav", 0.5, ATTN_STATIC);
  611. };
  612. /*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  613. */
  614. void() ambient_light_buzz =
  615. {
  616.     precache_sound ("ambience/fl_hum1.wav");
  617.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  618. };
  619. /*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  620. */
  621. void() ambient_swamp1 =
  622. {
  623.     precache_sound ("ambience/swamp1.wav");
  624.     ambientsound (self.origin, "ambience/swamp1.wav", 0.5, ATTN_STATIC);
  625. };
  626. /*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  627. */
  628. void() ambient_swamp2 =
  629. {
  630.     precache_sound ("ambience/swamp2.wav");
  631.     ambientsound (self.origin, "ambience/swamp2.wav", 0.5, ATTN_STATIC);
  632. };
  633.  
  634. //============================================================================
  635.  
  636. void() noise_think =
  637. {
  638.     self.nextthink = time + 0.5;
  639.     sound (self, 1, "enforcer/enfire.wav", 1, ATTN_NORM);
  640.     sound (self, 2, "enforcer/enfstop.wav", 1, ATTN_NORM);
  641.     sound (self, 3, "enforcer/sight1.wav", 1, ATTN_NORM);
  642.     sound (self, 4, "enforcer/sight2.wav", 1, ATTN_NORM);
  643.     sound (self, 5, "enforcer/sight3.wav", 1, ATTN_NORM);
  644.     sound (self, 6, "enforcer/sight4.wav", 1, ATTN_NORM);
  645.     sound (self, 7, "enforcer/pain1.wav", 1, ATTN_NORM);
  646. };
  647.  
  648. /*QUAKED misc_noisemaker (1 0.5 0) (-10 -10 -10) (10 10 10)
  649.  
  650. For optimzation testing, starts a lot of sounds.
  651. */
  652.  
  653. void() misc_noisemaker =
  654.  
  655. {
  656.     precache_sound2 ("enforcer/enfire.wav");
  657.     precache_sound2 ("enforcer/enfstop.wav");
  658.     precache_sound2 ("enforcer/sight1.wav");
  659.     precache_sound2 ("enforcer/sight2.wav");
  660.     precache_sound2 ("enforcer/sight3.wav");
  661.     precache_sound2 ("enforcer/sight4.wav");
  662.     precache_sound2 ("enforcer/pain1.wav");
  663.     precache_sound2 ("enforcer/pain2.wav");
  664.     precache_sound2 ("enforcer/death1.wav");
  665.     precache_sound2 ("enforcer/idle1.wav");
  666.  
  667.     self.nextthink = time + 0.1 + random();
  668.     self.think = noise_think;
  669. };
  670.